﻿//using Infrastructure.Dapper;
//using System;
//using System.Collections.Generic;
//using System.IO;
//using System.Net;
//using System.Security.Cryptography;
//using System.Text;

//namespace Infrastructure.Pay
//{
//    /// <summary>
//    /// 微信支付帮助类 
//    /// </summary>
//    public static class WechatPayHelper
//    {
//        /// <summary>
//        /// 密匙地址
//        /// </summary>
//        public static string CertifFile { get; set; }

//        /// <summary>
//        /// 小程序调起微信支付 签名格式
//        /// </summary>
//        /// <param name="appid"></param>
//        /// <param name="prepayId"></param>
//        /// <param name="keyPath"></param>
//        /// <returns></returns>
//        public static string PaySign(string appid, string prepayId, string keyPath)
//        {
//            string nonce = Guid.NewGuid().ToString();
//            var timestamp = DateTimeOffset.Now.ToUnixTimeSeconds();
//            //数据签名     HTTP请求方法\n接口地址的url\n请求时间戳\n请求随机串\n请求报文主体\n
//            string message = string.Format("{0}\n{1}\n{2}\nprepay_id={3}\n", appid, timestamp, nonce, prepayId);
//            return Sign(keyPath,message);
//        }

//        /// <summary>
//        /// 更具订单号获取是否支付成功
//        /// </summary>
//        /// <param name="payRecordNo">请求单号</param>
//        /// <param name="estateId">小区逐渐</param>
//        /// <param name="isPay">返回是否支付成功</param>
//        /// <returns></returns>
//        public static string GetPayRecord(Guid estateId,string payRecordNo, out bool isPay)
//        {
//            isPay = false;

//            //获取请求查询
//            var payModel = GetUtilsModel(estateId,"GetPayNo");
//            if (payModel == null)
//            {
//                return "未提供小区微信支付配置";
//            }

//            var appid = payModel.AppId;

//            //拼接查询地址
//            var url = $"{payModel.RequestUrl}{payRecordNo}?mchid={ payModel.Mchid}";


//            WebHeaderCollection headers = new WebHeaderCollection();
//            headers.Add("Authorization", GetAuthorization(url, payModel.ReqesetMethod, "", payModel.Mchid, payModel.SerialNo, payModel.KeyPath));
//            headers.Add("Accept", "text/html, application/xhtml+xml, image/jxr, */*");
//            headers.Add("user-agent", "Unknown");


//            var reponseHeaders = new Dictionary<string, string>();
//            //请求微信接口 预创订单
//            var result = HttpHelper.SendRequest(url, payModel.ReqesetMethod, "", headers);

//            var msg = ConvertJsonExtension.DeserializeObject(result, out Dictionary<string, dynamic> keyValue);
//            if (msg != "OK")
//            {
//                return "服务器出了点小问题，微信支付异常";
//            }

//            //获取appid  确认唯一
//            var wxAppid = Convert.ToString(keyValue["appid"]);
//            var out_trade_no = Convert.ToString(keyValue["out_trade_no"]);
//            var mchid = Convert.ToString(keyValue["mchid"]);
//            if (wxAppid != appid || mchid != payModel.Mchid || out_trade_no != payRecordNo)
//            {
//                return "服务器出了点小问题，微信支付异常";
//            }

//            //获取支付状态
//            var trade_state = Convert.ToString(keyValue["trade_state"]);
//            var trade_state_desc = Convert.ToString(keyValue["trade_state_desc"]);
//            if (trade_state == "SUCCESS" && trade_state_desc == "支付成功")
//            {
//                isPay = true;
//            }

//            return "OK";
//        }

//        /// <summary>
//        /// 微信支付 预付下单
//        /// </summary>
//        /// <param name="url">请求地址</param>
//        /// <param name="mthod">请求方式</param>
//        /// <param name="postData">请求数据</param>
//        /// <param name="merchantId">请求商户号</param>
//        /// <param name="serialNo">商户证书号</param>
//        /// <param name="prepay_id">需要返回的预付单号</param>
//        /// <param name="keyPath">支付密匙地址</param>
//        /// <returns></returns>
//        public static string PrePay(string url, string mthod, string postData, string merchantId, string serialNo,string keyPath, out string prepay_id)
//        {
//            prepay_id = "";

//            WebHeaderCollection headers = new WebHeaderCollection();
//            headers.Add("Authorization", GetAuthorization(url, mthod, postData, merchantId, serialNo, keyPath));
//            headers.Add("Accept", "text/html, application/xhtml+xml, image/jxr, */*");
//            headers.Add("user-agent", "Unknown");

//            var reponseHeaders = new Dictionary<string, string>();
//            //请求微信接口 预创订单
//            //var result = HttpHelper.SendRequest(url, mthod, postData, ref reponseHeaders, headers);
//            var result = HttpHelper.SendRequest(url, mthod, postData, headers);
//            var msg = ConvertJsonExtension.DeserializeObject(result, out Dictionary<string, string> keyValue);
//            if (msg != "OK")
//            {
//                return "服务器出了点小问题，微信支付异常";
//            }

//            prepay_id = keyValue["prepay_id"];
//            if (string.IsNullOrEmpty(prepay_id))
//            {
//                return "服务器出了点小问题,预创支付订单异常";
//            }
//            return "OK";
//        }


//        /// <summary>
//        /// 获取微信请求对象
//        /// </summary>
//        /// <param name="estateid"></param>
//        /// <param name="code"></param>
//        /// <returns></returns>
//        public static PayUtilsModel GetUtilsModel(Guid estateid, string code)
//        {
//            //获取请求查询
//            var payModel = sqlDapper.QueryFirst<PayUtilsModel>("select * from sys_payconfig where Code=@Code and EstateId=@EstateId", new { Code = code, EstateId = estateid });
//            //if (payModel == null)
//            //{
//            //    throw new Exception($"根据微信配置编码【{code}】获取相对于请求配置异常，获取数据为空");
//            //}

//            return payModel;
//        }


//        #region 私有属性/方法

//        /// <summary>
//        /// 获取HTTP头的授权信息
//        /// </summary>
//        /// <param name="url">微信的接口地址</param>
//        /// <param name="method">请求的方式GET,POST,PUT</param>
//        /// <param name="jsonParame">post请求的数据，json格式  ，get时传空</param>
//        /// <param name="privateKey">apiclient_key.pem中的内容，不要-----BEGIN PRIVATE KEY-----  -----END PRIVATE KEY-----</param>
//        /// <param name="merchantId">发起请求的商户（包括直连商户、服务商或渠道商）的商户号 mchid</param>
//        /// <param name="serialNo">商户证书号</param>
//        /// <param name="keyPath">支付密匙地址</param>
//        /// <returns></returns>
//        private static string GetAuthorization(string url, string method, string jsonParame, string merchantId, string serialNo,string keyPath)
//        {
//            //去除域名
//            var uri = new Uri(url);
//            string urlPath = uri.PathAndQuery.Replace("https://api.mch.weixin.qq.com", "");
//            string nonce = Guid.NewGuid().ToString();
//            var timestamp = DateTimeOffset.Now.ToUnixTimeSeconds();
//            //数据签名     HTTP请求方法\n接口地址的url\n请求时间戳\n请求随机串\n请求报文主体\n
//            method = string.IsNullOrEmpty(method) ? "" : method;
//            string message = string.Format("{0}\n{1}\n{2}\n{3}\n{4}\n", method.ToUpper(), urlPath, timestamp, nonce, jsonParame);
//            string signTxt = Sign(keyPath,message);

//            //Authorization和格式
//            string authorzationTxt = string.Format("WECHATPAY2-SHA256-RSA2048 mchid=\"{0}\",nonce_str=\"{1}\",timestamp=\"{2}\",serial_no=\"{3}\",signature=\"{4}\"",
//                merchantId,
//                nonce,
//                timestamp,
//                serialNo,
//                signTxt
//                );
//            return authorzationTxt;
//        }

//        /// <summary>
//        /// 微信支付签名加密
//        /// </summary>
//        /// <param name="message"></param>
//        /// <param name="keyPath"></param>
//        /// <returns></returns>
//        private static string Sign(string keyPath,string message)
//        {
//            if (string.IsNullOrEmpty(keyPath))
//            {
//                throw new Exception($"微信支付配置路由【KeyPath】不存在，读取失败");
//            }
//            string fileUrl = Path.Combine(CertifFile, keyPath);
//            if (!File.Exists(fileUrl))
//            {
//                throw new Exception($"微信支付配置路由【{fileUrl}】不存在，读取失败");
//            }

//            string privateKey = string.Empty;
//            //读取微信支付私钥
//            // 创建一个 StreamReader 的实例来读取文件 
//            // using 语句也能关闭 StreamReader
//            using (StreamReader sr = new StreamReader(fileUrl))
//            {
//                string line;
//                // 从文件读取并显示行，直到文件的末尾 
//                while ((line = sr.ReadLine()) != null)
//                {
//                    privateKey += line;
//                }
//            }
//            privateKey = privateKey.Replace("-----BEGIN PRIVATE KEY-----", "").Replace("-----END PRIVATE KEY-----", "");

//            byte[] keyData = Convert.FromBase64String(privateKey);

//            //使用通用环境下加密数据 
//            var rsa = RSA.Create();
//            rsa.FromXmlString(privateKey);
//            //int len = keyData.Length; net 不兼容
//            //rsa.ImportPkcs8PrivateKey(keyData, out len);

//            byte[] data = System.Text.Encoding.UTF8.GetBytes(message);
//            return Convert.ToBase64String(rsa.SignData(data, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1));


//            //window下加密数据
//            //using (CngKey cngKey = CngKey.Import(keyData, CngKeyBlobFormat.Pkcs8PrivateBlob))
//            //using (RSACng rsa = new RSACng(cngKey))
//            //{
//            //    byte[] data = System.Text.Encoding.UTF8.GetBytes(message);
//            //    return Convert.ToBase64String(rsa.SignData(data, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1));
//            //}
//        }

//        #endregion 
//    }
//}
